স্মার্ট পয়েন্টার হলো C++ এর একটি বিশেষ পয়েন্টার ক্লাস, যা C++11 থেকে যোগ করা হয়েছে। স্মার্ট পয়েন্টার প্রোগ্রামারদের জন্য ম্যানুয়াল মেমোরি ব্যবস্থাপনা ছাড়াই মেমোরি ম্যানেজমেন্ট সহজতর করে। স্মার্ট পয়েন্টারগুলি নিজে থেকেই মেমোরি বরাদ্দ ও মুক্ত করতে পারে, যা মেমোরি লিক এবং ড্যাংলিং পয়েন্টার সমস্যা সমাধানে সহায়ক।
C++ এ সাধারণ পয়েন্টার ব্যবহার করলে ডাইনামিক মেমোরি বরাদ্দের পরে delete
বা delete[]
ব্যবহার করে ম্যানুয়ালি মেমোরি মুক্ত করতে হয়। যদি ভুলে মেমোরি মুক্ত করা না হয়, তবে মেমোরি লিক এর সমস্যা দেখা দিতে পারে। স্মার্ট পয়েন্টার এই ধরনের সমস্যার সমাধান করে। এটি নিজে থেকেই মেমোরি মুক্ত করতে সক্ষম, ফলে প্রোগ্রামারকে মেমোরি ব্যবস্থাপনার দিকে কম মনোযোগ দিতে হয় এবং প্রোগ্রাম আরও কার্যকর হয়।
unique_ptr
পয়েন্টার মেমোরির মালিক হতে পারে।shared_ptr
পয়েন্টার মেমোরি ছেড়ে দেয়।shared_ptr
এর জন্য একটি উইক রেফারেন্স ধরে রাখে। এটি মেমোরির মালিকানা ধরে রাখে না, তবে shared_ptr
এর সাথে সংযুক্ত থাকে।unique_ptr
unique_ptr
C++ এর একটি স্মার্ট পয়েন্টার যা শুধুমাত্র একক মালিকানা সমর্থন করে। একবার একটি unique_ptr
মেমোরির মালিকানা নিলে, সেই মেমোরিকে আর অন্য কোনো unique_ptr
ধরে রাখতে পারে না। এটি কেবলমাত্র মুভ করা যায়, কপি করা যায় না।
unique_ptr
ব্যবহার#include <iostream>
#include <memory> // unique_ptr এর জন্য
using namespace std;
int main() {
unique_ptr<int> ptr1 = make_unique<int>(10); // ডাইনামিক্যালি মেমোরি বরাদ্দ
cout << "Value: " << *ptr1 << endl; // Output: Value: 10
// ptr2 = ptr1; // এটি বৈধ নয়, কারণ unique_ptr কপি করা যায় না
unique_ptr<int> ptr2 = move(ptr1); // ptr1 এর মালিকানা ptr2 তে সরানো হয়েছে
if (ptr1 == nullptr) {
cout << "ptr1 is now nullptr." << endl;
}
cout << "Value through ptr2: " << *ptr2 << endl; // Output: Value through ptr2: 10
return 0;
}
বর্ণনা:
make_unique<int>(10)
দিয়ে একটি unique_ptr
তৈরি করা হয়েছে।move(ptr1)
এর মাধ্যমে ptr1
এর মালিকানা ptr2
তে সরানো হয়েছে এবং ptr1
এর মান nullptr
হয়েছে।shared_ptr
shared_ptr
হল একটি স্মার্ট পয়েন্টার যা মেমোরির মালিকানা একাধিক পয়েন্টারের মধ্যে ভাগ করে। shared_ptr
এর রেফারেন্স কাউন্ট থাকে, যা নির্দেশ করে কতগুলি shared_ptr
সেই মেমোরি পয়েন্ট করছে। যখন রেফারেন্স কাউন্ট শূন্য হয়ে যায়, তখন মেমোরি স্বয়ংক্রিয়ভাবে মুক্ত হয়ে যায়।
shared_ptr
ব্যবহার#include <iostream>
#include <memory> // shared_ptr এর জন্য
using namespace std;
int main() {
shared_ptr<int> ptr1 = make_shared<int>(20); // ডাইনামিক্যালি মেমোরি বরাদ্দ
cout << "Value: " << *ptr1 << endl; // Output: Value: 20
cout << "Reference count: " << ptr1.use_count() << endl; // রেফারেন্স কাউন্ট চেক
{
shared_ptr<int> ptr2 = ptr1; // ptr1 এর সাথে ptr2 এর মালিকানা ভাগ করা হচ্ছে
cout << "Reference count after ptr2: " << ptr1.use_count() << endl; // রেফারেন্স কাউন্ট: 2
}
cout << "Reference count after ptr2 goes out of scope: " << ptr1.use_count() << endl; // রেফারেন্স কাউন্ট: 1
return 0;
}
বর্ণনা:
make_shared<int>(20)
ব্যবহার করে একটি shared_ptr
তৈরি করা হয়েছে।ptr2
যখন ptr1
এর সাথে মেমোরি ভাগ করছে, তখন রেফারেন্স কাউন্ট 2
হয়েছে।ptr2
স্কোপের বাইরে চলে যাওয়ার পর রেফারেন্স কাউন্ট 1
এ ফিরে এসেছে।weak_ptr
weak_ptr
একটি shared_ptr
এর জন্য উইক রেফারেন্স প্রদান করে, যা মেমোরির মালিকানা ধরে রাখে না। এটি সাধারণত shared_ptr
এর সাথে মেমোরি ব্যবহারের জন্য ব্যবহৃত হয়, যাতে shared_ptr
এর রেফারেন্স কাউন্ট না বাড়ে এবং মেমোরি ব্যবস্থাপনা সহজ হয়।
weak_ptr
ব্যবহার#include <iostream>
#include <memory>
using namespace std;
int main() {
shared_ptr<int> sharedPtr = make_shared<int>(30); // একটি shared_ptr তৈরি করা
weak_ptr<int> weakPtr = sharedPtr; // একটি weak_ptr দিয়ে sharedPtr কে রেফারেন্স করা
cout << "Shared pointer reference count: " << sharedPtr.use_count() << endl; // Output: 1
if (auto lockedPtr = weakPtr.lock()) { // weak_ptr থেকে shared_ptr তৈরি করা
cout << "Locked pointer value: " << *lockedPtr << endl; // Output: 30
} else {
cout << "weakPtr is expired." << endl;
}
return 0;
}
বর্ণনা:
weakPtr
নামে একটি weak_ptr
তৈরি করা হয়েছে, যা sharedPtr
কে রেফারেন্স করছে।weakPtr.lock()
ব্যবহার করে একটি shared_ptr
তৈরি করা হয়েছে, যা weakPtr
সক্রিয় থাকলে তার মান প্রদর্শন করে।unique_ptr
, shared_ptr
, এবং weak_ptr
এর তুলনাবৈশিষ্ট্য | unique_ptr | shared_ptr | weak_ptr |
---|---|---|---|
মালিকানা | একক মালিকানা | একাধিক মালিকানা | মালিকানা ধরে রাখে না |
রেফারেন্স কাউন্ট | নেই | রেফারেন্স কাউন্ট থাকে | নেই, তবে shared_ptr এর রেফারেন্স ধরে |
কপি করা | কপি করা যায় না, শুধু মুভ করা যায় | কপি এবং মুভ করা যায় | কপি করা যায়, কিন্তু সরাসরি মেমোরি অ্যাক্সেস নয় |
ব্যবহারের উদ্দেশ্য | একক মালিকানা, স্বয়ংসম্পূর্ণ মালিকানার জন্য | একাধিক রেফারেন্স যখন প্রয়োজন | উইক রেফারেন্স, সাইক্লিক ডিপেন্ডেন্স রোধে সহায়ক |
unique_ptr
: একক মালিকানা নিশ্চিত করে, অন্য কোনো পয়েন্টার সেই মেমোরির মালিক হতে পারে না।shared_ptr
: মেমোরি মালিকানা একাধিক পয়েন্টারের মধ্যে ভাগ করে নিতে সক্ষম।weak_ptr
: একটি shared_ptr
এর উইক রেফারেন্স ধরে রাখে, যা মূলত রেফারেন্স কাউন্ট না বাড়িয়ে মেমোরি অ্যাক্সেস করতে দেয়।স্মার্ট পয়েন্টার C++ এ মেমোরি ব্যবস্থাপনা সহজ, নিরাপদ, এবং কার্যকর করে তোলে, যা প্রোগ্রামিংয়ে মেমোরি লিক এবং ড্যাংলিং পয়েন্টার সমস্যার সমাধান প্রদান করে।
common.read_more